package com.sh4.util;

import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.Locale;
import java.util.Map;
import java.util.TimeZone;

import javax.servlet.http.HttpServletRequest;

import org.apache.commons.lang.StringUtils;


import sun.misc.BASE64Decoder;
import sun.misc.BASE64Encoder;
  
@SuppressWarnings("restriction")
public class Base64Utils {  
	
	private static String separator = File.separator;

    public static void main(String[] args) {
   	 System.out.println(Base64Utils.ImageToBase64ByLocal("D:/plm/1.jpg"));
	}
    /** 
     * 本地图片转换成base64字符串 
     * @param imgFile   图片本地路径 
     * @return 
     */  
    public static String ImageToBase64ByLocal(String imgFile) {// 将图片文件转化为字节数组字符串，并对其进行Base64编码处理  
        InputStream in = null;  
        byte[] data = null;  
  
        // 读取图片字节数组  
        try {  
            in = new FileInputStream(imgFile);  
              
            data = new byte[in.available()];  
            in.read(data);  
            in.close();  
        } catch (IOException e) {  
            e.printStackTrace();  
        }  
        // 对字节数组Base64编码  
        BASE64Encoder encoder = new BASE64Encoder();  
        return encoder.encode(data);// 返回Base64编码过的字节数组字符串  
    }  
  
      
    /** 
     * 在线图片转换成base64字符串 
     *  
     * @param imgURL    图片线上路径 
     * @return 
     */  
    public static String ImageToBase64ByOnline(String imgURL) {  
        ByteArrayOutputStream data = new ByteArrayOutputStream();  
        try {  
            // 创建URL  
            URL url = new URL(imgURL);  
            byte[] by = new byte[1024];  
            // 创建链接  
            HttpURLConnection conn = (HttpURLConnection) url.openConnection();  
            conn.setRequestMethod("GET");  
            conn.setConnectTimeout(5000);  
            InputStream is = conn.getInputStream();  
            // 将内容读取内存中  
            int len = -1;  
            while ((len = is.read(by)) != -1) {  
                data.write(by, 0, len);  
            }  
            // 关闭流  
            is.close();  
        } catch (IOException e) {  
            e.printStackTrace();  
        }  
        // 对字节数组Base64编码  
        BASE64Encoder encoder = new BASE64Encoder();  
        return encoder.encode(data.toByteArray());  
    }  
  
      
    /** 
     * base64字符串转换成图片 
     * @param imgStr        base64字符串 
     * @param imgFilePath   图片存放路径 
     * @return 
     */  
    public static boolean Base64ToImage(String imgStr,String imgFilePath) { // 对字节数组字符串进行Base64解码并生成图片  
  
        if (StringUtils.isBlank(imgStr)) // 图像数据为空  
            return false;  
  
        BASE64Decoder decoder = new BASE64Decoder();  
        try {  
            // Base64解码  
            byte[] b = decoder.decodeBuffer(imgStr);  
            for (int i = 0; i < b.length; ++i) {  
                if (b[i] < 0) {// 调整异常数据  
                    b[i] += 256;  
                }  
            }  
  
            /**
      		 * 保存 原图片
      		 */
            
            imgFilePath +=  separator + System.currentTimeMillis() + ".png";
            
      		// 判断文件保存是否存在
      		File file = new File(imgFilePath);

      		if (file.getParentFile() != null || !file.getParentFile().isDirectory()) {
      			// 创建文件
      			file.getParentFile().mkdirs();
      		}
            
            OutputStream out = new FileOutputStream(imgFilePath);  
            out.write(b);  
            out.flush();  
            out.close();  
  
            return true;  
        } catch (Exception e) {  
            return false;  
        }  
  
    }  
    
    public static  Map<String , Object> uploadBase64EncondingFile(Map<String, Object> params,HttpServletRequest request){
    	
    	Map<String , Object> result = new HashMap<String , Object>();
    	int status = 200;
    	String msg = "success";
    	
    	if(!params.containsKey("encodedStr")){
    		status = 300;
    		msg = "参数不全";
		}else{
			String projectPath = getProgectUrl();
			System.out.println(projectPath);
			if(!isWincows()) {
				projectPath = separator+projectPath;
			}
			String webPath = "/UploadBase64Image/"+ getCurrentCnDateWithString()+"/"
			+ System.currentTimeMillis(),filePathName = projectPath+webPath;
			System.out.println(filePathName);
			boolean b = Base64Utils.Base64ToImage(params.get("encodedStr").toString(), filePathName+".png");
			if(b){
				String requestUrl = request.getRequestURL().toString();// 获取当前请求的URL
				requestUrl = requestUrl.substring(0, requestUrl.indexOf(request.getContextPath()));
				result.put("path", filePathName);
				result.put("originalUrl", requestUrl+webPath+".png");
				
			}else{
				status = 300;
				msg = "保存失败";
			}
		}
    	result.put("status", status);
    	result.put("msg", msg);
    	return result;
    	
    }
    
    public static String getProgectUrl() {
		String p = Base64Utils.class.getClassLoader().getResource("").getPath();
		String[] ps = p.split("/");
		int l = ps.length;
		String t = null;
		String path = "";
		if (l > 0) {
			for (int i = 0; i <= l; i++) {
				if (i == 0) {
					continue;
				}
				t = ps[i];
				if (t.contains("webapps")) {
					break;
				}
				path += t + "/";
			}
		}
		return path + "webapps";
	}
	
	public static Boolean isWincows() {
		String os = System.getProperty("os.name");
		if (os.toLowerCase().startsWith("win")) {
			return true;
		} else {
			return false;
		}
	}
	
	public static String getCurrentCnDateWithString() {
		Date date = new Date();
		SimpleDateFormat fm = new SimpleDateFormat("yyyyMMdd", Locale.CHINA);
		fm.setTimeZone(TimeZone.getTimeZone("GMT+8"));
		String moditime = fm.format(date);
		return moditime;
	}
	/**
	 * 判断 是否是 图片
	 * 
	 * @param fileName
	 * @return
	 */
	private static boolean checkImg(String fileName) {
		if (fileName.endsWith("jpg") || fileName.endsWith("JPG")
				|| fileName.endsWith("jpeg") || fileName.endsWith("bmp")
				|| fileName.endsWith("gif") || fileName.endsWith("png")) {
			return true;
		}
		return false;
	}
      
}  